#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#define ERR_EXIT(m)\
do\
{\
    perror(m);\
    exit(EXIT_FAILURE);\
}while(0)
void handler(int signum){
    printf("get signal mypid:%d\n",signum);
}

int main(){
    signal(SIGCHLD,handler);
    pid_t pid = fork();
    if(pid == -1){
        ERR_EXIT("fork");
    }
    else if(pid == 0){
        pid_t ppid = fork();
        if(ppid == 0){
            sleep(1);
            std::cout << "i am child\n";
            exit(3);
        }
        sleep(2);
        waitpid(ppid,NULL,0);
        std::cout << "i am father\n";
        exit(3);
    }
    else{
        sleep(3);
        waitpid(pid,NULL,0);
        std::cout << "i am grandfather\n";

    }

    return 0;
}

// #include <iostream>
// #include <unistd.h>
// #include <sys/types.h>
// #include <sys/wait.h>
// #include <signal.h>
// #include <cstdlib>
// #define ERR_EXIT(m) \
//     do \
//     { \
//         perror(m); \
//         exit(EXIT_FAILURE); \
//     } while (0)

// void handler(int signum) {
//     printf("get signal mypid:%d\n", signum);
// }

// int main() {
//     signal(SIGCHLD, handler);
//     pid_t pid = fork();
//     if (pid == -1) {
//         ERR_EXIT("fork");
//     }
//     else if (pid == 0) {
//         pid_t ppid = fork();
//         if (ppid == 0) {
//             std::cout << "i am child\n";
//             exit(3);
//         }
//         waitpid(ppid, NULL, 0);
//         std::cout << "i am father\n";
//         exit(3);
//     }
//     else {
//         waitpid(pid, NULL, 0);
//         std::cout << "i am grandfather\n";
//     }

//     return 0;
// }